Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

230
Vistas
¿Por qué la función pop no se ejecuta con stack[*top--] pero funciona con stack[*(top--)]?

El problema es que no puedo usar la función pop.

 int pop(int stack[],int *top,int item) { if(*top==-1) { printf("Stack Underflow"); return 0; } return stack[(*top)--]; }

Aquí, si uso stack[*top--] parece que no funciona! ¿Cuál es la diferencia? ¿Por qué la variable superior en la función principal no se reduce?

 int main() { int stack[4], top = -1, item, id, ch; for(;;) { printf("Enter your choice:\n1.push\n2.pop\n3.Print top element\n4.Print all elements\n5.Exit\n"); scanf("%d",&ch); switch(ch) { case 1: printf("Enter the item to be pushed:\n"); scanf("%d",&item); push(stack,&top,item); break; case 2: id=pop(stack,&top,item); printf("%d was popped\n",id); break; case 4: print(stack,&top,item); break; case 5: exit(0); } } }
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Lo que (*top)-- hace es:

  1. Desreferencia top , es decir, accede al valor al que apunta top .
  2. Disminuye ese valor.

Lo que hace *top-- es:

  1. Decrementa top , es decir, el valor de top mismo
  2. Desreferencia ese valor.

Además de eso, creo que sería mejor si define una estructura de pila en lugar de usar una matriz sin procesar y un número entero como puntero.

 #define STACK_CAPACITY 3 // Adjust it as you want struct stack { int items[STACK_CAPACITY]; int top; }; void stack_init(struct stack *s) { s->top = -1; } int stack_push(struct stack *s, int item) { if (s->top == STACK_CAPACITY-1) return 0; // fail: stack is full s->items[++s->top] = item; return 1; // success: item pushed } int stack_pop(struct stack *s, int *top) { if (s->top == -1) return 0; if (top != NULL) // if top is NULL, ignore it *top = s->items[s->top]; s->top--; return 1; }

Así es como puedes usarlo:

 int main() { struct stack s; stack_init(&s); if (!stack_push(&s, 1)) printf("Stack is full\n"); if (!stack_push(&s, 2)) printf("Stack is full\n"); if (!stack_push(&s, 3)) printf("Stack is full\n"); if (!stack_push(&s, 4)) printf("Stack is full\n"); if (!stack_push(&s, 5)) printf("Stack is full\n"); int item; stack_pop(&s, &item); printf("top = %d\n", item); // outputs 3 stack_pop(&s, NULL); // Ignore the top stack_pop(&s, &item); printf("top = %d\n", item); // outputs 1 if (!stack_pop(&s, NULL)) { printf("Stack is empty: cannot pop\n"); } }

Además, no use scanf() para leer la entrada del usuario. fgets() es mucho más seguro.

over 4 years ago · Santiago Trujillo Denunciar

0

En C, todos los operadores de posfijos tienen mayor precedencia que todos los operadores de prefijos (o infijos). Así es como se define el lenguaje. Asi que

 *top--

es equivalente a

 *(top--)

y si tu quieres

 (*top)--

necesitas el paréntesis explícito.

over 4 years ago · Santiago Trujillo Denunciar

0

return stack[(*top)--];
here if I use [*top--]

(*top)-- obtiene el objeto al que apunta la top y lo decrementa. Debido a que *top apunta a la parte top de la persona que llama, ese es el valor que desea usar para buscar un elemento de matriz. Luego -- disminuye el top de la persona que llama, haciendo que apunte al siguiente elemento más reciente en la pila.

*top-- es *(top--) , que decrementa top y obtiene el objeto al que apunta el valor no decrementado. Eso también obtiene la top de la persona que llama, pero disminuye la parte top local de la función, no el objeto de la persona que llama. Debido a que la top de la función se reduce, ya no apunta a la top de la persona que llama.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda